package limeirafol.bean;

import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Vector;
import lbframework.classe.Conexao;
import lbframework.classe.LBException;
import lbframework.classe.Util;
import limeirafol.remote.financeiro.ChequesRecebidosFiltroConsultaVO;
import limeirafol.remote.financeiro.ChequesRecebidosVO;
import limeirafol.remote.financeiro.SituacaoChequeRecebido;
import limeirafol.remote.financeiro.TipoDataCheque;

public class BeanFinanceiro {

    public void salvarChequeRecebido(ChequesRecebidosVO i_cheque) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();
        sql = new StringBuilder();

        sql.append("SELECT * FROM chequesrecebidos WHERE id = " + i_cheque.id);
        rst = stm.executeQuery(sql.toString());

        if (rst.next()) {
            sql = new StringBuilder();
            sql.append("UPDATE chequesrecebidos SET");
            sql.append(" numerocheque = " + i_cheque.numeroCheque + ",");
            sql.append(" descricao = '" + i_cheque.descricao + "',");
            sql.append(" chequepre = " + i_cheque.bomPara + ",");
            sql.append(" databompara = '" + i_cheque.dataBomPara + "',");
            sql.append(" valor = " + i_cheque.valor + ",");
            sql.append(" observacoes = '" + i_cheque.observacoes + "',");
            sql.append(" id_situacaocheque = " + i_cheque.idSituacaoCheque);
            sql.append(" WHERE id = " + i_cheque.id);

            stm.execute(sql.toString());

        } else {

            sql = new StringBuilder();
            sql.append("INSERT INTO chequesrecebidos (datalancamento, numerocheque, descricao,");
            sql.append(" chequepre, databompara, observacoes, valor, id_situacaocheque)");
            sql.append(" VALUES (");
            sql.append("'" + i_cheque.dataLancamento + "', ");
            sql.append(i_cheque.numeroCheque + ", ");
            sql.append("'" + i_cheque.descricao + "', ");
            sql.append(i_cheque.bomPara + ", ");
            sql.append("'" + i_cheque.dataBomPara + "', ");
            sql.append("'" + i_cheque.observacoes + "', ");
            sql.append(i_cheque.valor + ", ");
            sql.append(i_cheque.idSituacaoCheque + ")");
            stm.execute(sql.toString());

            rst = stm.executeQuery("SELECT CURRVAL('chequesrecebidos_id_seq') AS id");
            rst.next();

            i_cheque.id = rst.getInt("id");
        }
    }

    public ChequesRecebidosVO carregarChequeRecebido(int i_id) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();

        rst = stm.executeQuery("SELECT * FROM chequesrecebidos WHERE id = " + i_id);

        if (!rst.next()) {
            throw new LBException("Cheque não encontrado!");
        }

        ChequesRecebidosVO oCheque = new ChequesRecebidosVO();
        oCheque.id = rst.getInt("id");
        oCheque.dataLancamento = Util.formatDataGUI(rst.getDate("datalancamento"));
        oCheque.numeroCheque = rst.getLong("numerocheque");
        oCheque.descricao = rst.getString("descricao");
        oCheque.bomPara = rst.getBoolean("chequepre");
        oCheque.dataBomPara = Util.formatDataGUI(rst.getDate("databompara"));
        oCheque.valor = rst.getDouble("valor");
        oCheque.observacoes = rst.getString("observacoes");
        oCheque.idSituacaoCheque = rst.getInt("id_situacaocheque");

        stm.close();

        return oCheque;

    }

    public void alterarSituacaoCheque(int i_id, int i_situacao) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();
        sql = new StringBuilder();

        if (i_situacao == SituacaoChequeRecebido.DEPOSITADO.getId()) {
            stm.execute("UPDATE chequesrecebidos SET id_situacaocheque = " + SituacaoChequeRecebido.DEPOSITADO.getId() + " WHERE id = " + i_id);
        }

        if (i_situacao == SituacaoChequeRecebido.DEVOLVIDO.getId()) {
            stm.execute("UPDATE chequesrecebidos SET id_situacaocheque = " + SituacaoChequeRecebido.DEVOLVIDO.getId() + " WHERE id = " + i_id);
        }
        if (i_situacao == SituacaoChequeRecebido.DEVOLVIDO_CLIENTE.getId()) {
            stm.execute("UPDATE chequesrecebidos SET id_situacaocheque = " + SituacaoChequeRecebido.DEVOLVIDO_CLIENTE.getId() + " WHERE id = " + i_id);
        }
        if (i_situacao == SituacaoChequeRecebido.RECEBIDO.getId()) {
            stm.execute("UPDATE chequesrecebidos SET id_situacaocheque = " + SituacaoChequeRecebido.RECEBIDO.getId() + " WHERE id = " + i_id);
        }
        if (i_situacao == SituacaoChequeRecebido.ABERTO.getId()) {
            stm.execute("UPDATE chequesrecebidos SET id_situacaocheque = " + SituacaoChequeRecebido.ABERTO.getId() + " WHERE id = " + i_id);
        }
    }

    public Vector<ChequesRecebidosVO> consultarChequesRecebidos(ChequesRecebidosFiltroConsultaVO i_filtro) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();

        sql = new StringBuilder();
        sql.append(" SELECT cr.*, sc.descricao AS situacaocheque");
        sql.append(" FROM chequesrecebidos AS cr");
        sql.append(" INNER JOIN situacaocheque AS sc ON sc.id = cr.id_situacaocheque");
        sql.append(" WHERE 1 = 1");

        if (i_filtro.tipoData != -1) {
            if (i_filtro.tipoData == TipoDataCheque.LANCAMENTO.getId()) {
                sql.append("AND cr.datalancamento BETWEEN '" + Util.formatDataBanco(i_filtro.dataInicio) + "' AND '" + Util.formatDataBanco(i_filtro.dataTermino) + "'");
            }
            if (i_filtro.tipoData == TipoDataCheque.VENCIMENTO.getId()) {
                sql.append("AND cr.databompara BETWEEN '" + Util.formatDataBanco(i_filtro.dataInicio) + "' AND '" + Util.formatDataBanco(i_filtro.dataTermino) + "'");
            }
        }
        if (!i_filtro.numeroCheque.equals("")) {
            sql.append("AND " + Util.getGoogle("cr.numerocheque", i_filtro.numeroCheque));
        }

        if (!i_filtro.descricao.trim().equals("")) {
            sql.append(" AND " + Util.getGoogle("cr.descricao", i_filtro.descricao));
        }

        if (i_filtro.idSituacaoCheque != -1) {
            sql.append(" AND cr.id_situacaocheque = " + i_filtro.idSituacaoCheque);
        }

        sql.append(" ORDER BY cr.datalancamento");

        rst = stm.executeQuery(sql.toString());

        Vector<ChequesRecebidosVO> vCheque = new Vector();

        while (rst.next()) {
            ChequesRecebidosVO oCheque = new ChequesRecebidosVO();
            oCheque.id = rst.getInt("id");
            oCheque.dataLancamento = rst.getDate("datalancamento") == null ? "" : Util.formatDataGUI(rst.getDate("datalancamento"));
            oCheque.numeroCheque = rst.getLong("numerocheque");
            oCheque.descricao = rst.getString("descricao");
            oCheque.bomPara = rst.getBoolean("chequepre");
            oCheque.dataBomPara = rst.getDate("databompara") == null ? "" : Util.formatDataGUI(rst.getDate("databompara"));
            oCheque.observacoes = rst.getString("observacoes");
            oCheque.valor = rst.getDouble("valor");
            oCheque.situacaoCheque = rst.getString("situacaocheque");

            vCheque.add(oCheque);
        }

        stm.close();

        return vCheque;
    }

    public void excluirChequeRecebido(int i_id) throws Exception {
        Statement stm = null;

        try {
            Conexao.begin();
            stm = Conexao.createStatement();

            stm.execute("UPDATE chequesrecebidos SET id_situacaocheque = " + SituacaoChequeRecebido.EXCLUIDO.getId() + " WHERE id = " + i_id);

            stm.close();
            Conexao.commit();

        } catch (Exception ex) {
            Conexao.rollback();
            throw ex;
        }
    }

    public ChequesRecebidosVO getDataBomParaCheques(String i_dataProcessamento) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();

        sql = new StringBuilder();
        sql.append(" SELECT * FROM chequesrecebidos");
        sql.append(" WHERE databompara = " + Util.formatDataBanco(i_dataProcessamento));
        rst = stm.executeQuery(sql.toString());
        ChequesRecebidosVO oCheque = new ChequesRecebidosVO();

        while (rst.next()) {
            oCheque.id = rst.getInt("id");
            oCheque.dataLancamento = rst.getDate("datalancamento") == null ? "" : Util.formatDataGUI(rst.getDate("datalancamento"));
            oCheque.numeroCheque = rst.getLong("numerocheque");
            oCheque.descricao = rst.getString("descricao");
            oCheque.bomPara = rst.getBoolean("chequepre");
            oCheque.dataBomPara = rst.getDate("databompara") == null ? "" : Util.formatDataGUI(rst.getDate("databompara"));
            oCheque.observacoes = rst.getString("observacoes");
            oCheque.valor = rst.getDouble("valor");
            oCheque.situacaoCheque = rst.getString("situacaocheque");
        }
        return oCheque;
    }
}
